package java_concurrency_program_design_in_practice.atomic_reference;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 当对一个共享变量执行操作时，我们可以使用循环CAS的方式来保证原子操作，
 * 但是对多个共享变量操作时，循环CAS就无法保证操作的原子性，这个时候就可以用锁。
 * 还有一个取巧的办法，就是把多个共享变量合并成一个共享变量来操作。
 * 从Java 1.5开始，JDK提供了AtomicReference类来保证引用对象之间的原子性，
 * 就可以把多个变量放在一个对象里来进行CAS操作。
 * @author lixiangke
 * @date 2018/1/20
 */
public class AtomicReferenceDemo3 {
    public static void main(String[] args) {
        AtomicInteger at = new AtomicInteger(10);
        at.compareAndSet(10, 20);
        System.out.println(at.get());

        AtomicReference<People> ar = new AtomicReference();
        People leexk = new People("leexk", 18);
        ar.set(leexk);
        People gg = new People("gg", 16);
        ar.compareAndSet(leexk, gg);
        System.out.println(ar.get().name);
    }

    static class People {
        private String name;
        private int age;

        public People(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
}
